home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SPACE 1
/
SPACE - Library 1 - Volume 1.iso
/
program
/
16
/
modem.fth
< prev
next >
Wrap
Text File
|
1985-11-19
|
3KB
|
102 lines
\ Serial line handling. Defines a vocabulary "modem" which contains:
\
\ m-key ( -- char ) Get a character from the serial line
\ m-key? ( -- flag ) True if a character is waiting
\ m-emit ( char -- ) Output a character to the serial line
\
\ The following commands establish serial line parameters.
\ They all have the stack diagram ( -- )
\
\ 19200-baud 9600-baud 4800-baud 2400-baud 1200-baud 300-baud
\ 0-stop-bits 1-stop-bit 1.5-stop-bits 2-stop-bits
\ 8-bits 7-bits
\ no-parity odd-parity even-parity
\ no-flow-control use-xon/xoff use-rts/cts
\
\ Important: They do not take effect until the set-line command is
\ executed.
\
\ set-line Make the established serial line parameters take effect
\
\ There are some (I presume) uninteresting parameters for which words
\ are not defined (example - 2000-baud). Comments in the code describe
\ the appropriate magic numbers to use should you need to define them.
\
\ Warning: I have seen evidence that the act of setting the serial line
\ parameters causes a single spurious 'ff' character to be output on the
\ serial line. I think this may be a bug in either the Atari BIOS or
\ the serial line chip.
vocabulary modem
only forth also system also modem also definitions
alias m-key c_auxin ( -- char )
alias m-key? c_auxis ( -- flag )
alias m-emit c_auxout ( char -- )
only forth also modem also definitions
decimal
\ Translates baud rate to the appropriate magic number
variable baud-rate
: baud: ( n -- ) ( Input stream: name )
create ,
does> @ baud-rate !
;
0 baud: 19200-baud 1 baud: 9600-baud 2 baud: 4800-baud
4 baud: 2400-baud 7 baud: 1200-baud 9 baud: 300-baud
\ Other baud rates are available, though perhaps not useful
\ Here is the full list:
\ 19200 ( 0 ) 9600 ( 1 ) 4800 ( 2 ) 3600 ( 3 ) 2400 ( 4 )
\ 2000 ( 5 ) 1800 ( 6 ) 1200 ( 7 ) 600 ( 8 ) 300 ( 9 )
variable #stop-bits
: stop: ( n -- ) ( Input stream: name )
create , does> @ #stop-bits !
;
0 stop: 0-stop-bits
th 08 stop: 1-stop-bit
th 10 stop: 1.5-stop-bits
th 18 stop: 2-stop-bits
variable #data-bits
: 8-bits ( -- ) 0 #data-bits ! ;
: 7-bits ( -- ) th 20 #data-bits ! ;
\ 6-bits is th 40, 5-bits is th 60; do people really use 6 or 5 bits?
variable parity
: no-parity ( -- ) 0 parity ! ;
: odd-parity ( -- ) th 4 parity ! ;
: even-parity ( -- ) th 6 parity ! ;
variable flow-control 0 flow-control !
: flow: ( n -- ) ( Input stream: name )
create , does> @ flow-control !
;
0 flow: no-flow-control
1 flow: use-xon/xoff
2 flow: use-rts/cts
wvariable ucr th ffff ucr w! \ USART control register image
wvariable rsr th ffff rsr w! \ receive status register image
wvariable tsr th ffff tsr w! \ transmit status register image
wvariable scr th ffff scr w! \ sync character register image
td 15 xbios: rsconf { w.scr w.tsr w.rsr w.ucr w.flowctl w.speed -- }
: set-ucr ( -- )
th 80 \ This bit is the divide-by-16 bit
#stop-bits @ or #data-bits @ or parity @ or
ucr w!
;
: set-line ( -- )
set-ucr
scr w@ tsr w@ rsr w@ ucr w@ flow-control @ baud-rate @
rsconf
;